/*
 * @Author: Clark
 * @Email: haixuanwoTxh@gmail.com
 * @Date: 2022-10-14 14:06:43
 * @LastEditors: Clark
 * @LastEditTime: 2022-10-15 11:26:12
 * @Description: file content
 */

#ifndef MESSAGE_H
#define MESSAGE_H

#include <stdint.h>

/**********************************************************
| head  | msgId | len | data | checksum        | end     |
-----------------------------------------------------------
|0xEFAA |   1   |  2  | n    | len+data累加和   | 可无    |
*********************************************************/

#define HEAD1 0xEF
#define HEAD2 0xAA

#define MAX_DATA_LEN        4000        // 最大消息数据长度
#define MAX_PACKET_LEN      4096        // 最大包长
#define MIN_PACKET_LEN      6           // head+msgId+len+checksum

/**
 * @brief 消息命令ID
 */
typedef enum{
    // slave -> master
    MSG_HEARTBEAT,          // 心跳
    MSG_REPLY,              // 回应，内带对应消息类型
    MSG_UPLOAD_DATA,        // slave主动上传数据

    // master -> slave
    MSG_SET_PARAM,          // 设置参数
    MSG_GET_PARAM,          // 获取参数
    MSG_GET_STATUS,         // 获取状态
    MSG_GET_DATA,           // 获取数据

    MSG_UPGRADE_START,      // 开始升级
    MSG_UPGRADE_STOP,       // 停止升级
    MSG_UPGRADE_DATA,       // 升级数据

    MSG_REBOOT,             // 重启
    MSG_POWER_OFF,          // 关机
    MSG_ENABLE_LOG,         // 开启日志
    MSG_DISABLE_LOG,        // 关闭日志
    MSG_UPLOAD_LOG,         // 上传日志
}MsgId;

/**
 * @brief 消息结果
 */
typedef enum{
    MSG_RES_SUCCESS,                // 成功
    MSG_RES_FAIL_UNKNOWNREASON,     // 未知的失败原因
    MSG_RES_FAIL_INVALIDPARAM,      // 无效的参数
}MsgResult;

typedef struct{
    MsgId msgId;
    uint32_t dataLen;
    uint8_t data[MAX_DATA_LEN];
}MsgData;


#endif
